【VR】Oculus Quest2でパススルーを利用してみる(外部カメラ)

November 10, 2022


Oculus Quest2では外部カメラ、パススルーを利用することが可能です

Oculus Quest2では白黒+解像度がめちゃくちゃ低い… という欠点はありますが例えば疑似AR演出などには利用できるかと思います

Oculus Proではカラーで映る模様です。 将来的には外部カメラの解像度も上がり、ARとしての使い道も十分にできるのではないかと考えています

開発環境は

  • Unity2022.1.20f1
  • Oculus Quest2

Document

https://developer.oculus.com/documentation/unity/unity-passthrough/

また、以下のサイト様を参考にさせていただいています(いつも大変お世話になっています) https://framesynthesis.jp/tech/

環境準備

Oculus Quest2でパススルーを利用するためにはOculusの統合環境である Oculus Integration が必要です 2022/11 現在、Unity Asset Store から導入 https://assetstore.unity.com/packages/tools/integration/oculus-integration-82022?locale=ja-JP

2023年にはUnityPackageManagerにより、必要なものを個別に導入することが可能になるようです https://developer.oculus.com/blog/unity-package-manager-integration-sdks/

VR機器共通Unity SDKである

  • XR Interaction Toolkit
  • OpenXR Plugin

のみでも出来ないかなと思ったのですが.. 現状無理でした

もしOculus以外のVR機器にも対応させる場合は適宜SDKやPrefabを入れ替える(有効/無効化)させて上げる必要があります

実装

VRの設定は終わっている前提として Unity Editor上で Air Link を利用したデバッグを想定ですすめます

ビルドターゲットはAndroidに設定

XR Plug-in Management

ここではOculus 独自の機能を利用するため Oculus を選択

B3ACBE1A905059642BE0FCA6F050EFDF

ちなみに Stereo Rendering Mode は シングルパス(Instanced) を選択してあります B2E7665EAD2C9807E497A6FE0A928850

Prefab設定

OVRCameraRig.prefab をOculusSDKから取り出してシーンに配置 320B3A79F85621924FEC0BB525C06A49

OVR Manager では

  • Passthrough Capability Enabled にチェックを入れる
  • Enable Passthrough にチェックを入れる

そして CVRPassthrough Layer をアタッチ

C0E6EBD3CADB0C047563FB0D6442E7F6

OVR Passthrough Layer の設定で重要な箇所として Compositing 内の Placement 項目にて合成方法を Overlay または Underlay の選択が可能です。

もし上にオブジェクトを置きたい場合は Underlay にする必要があります

複数の OVRPassthroughLayer を利用したい場合などは、Composition Depth 設定にて描画順序を適切に設定してあげます (利用するかは不明として最大3つのインスタンスをアクティブにすることが出来るようです)

以上のみで、PlayModeに入った時に外部カメラが利用されて画面に表示されます

もし Underlay 設定で実行時に SkyBox が見えているようであれば Window → Rendering → Environment からSkyBoxMaterialを削除してください。 もし削除できないのであればCameraのBackgroundTypeを UnInitialized に変更するなど対応が必要です

スクリプトから任意のタイミングでONにする

ほか設定はそのままに OVR Manager の Enable Passthrough のチェックをOFFIに。 905F69280956C345518384412759ABD0

後はスクリプト側でOVRManagerのインスタンスから ON/OFF を切り替えると動作

public void SetEnable(bool isEnable)
{
		OVRManager.instance.isInsightPassthroughEnabled = isEnable;
}

その他

Oculusではパススルーの使い方に関するページを公開しています https://developer.oculus.com/documentation/unity/unity-customize-passthrough/#style

例えばカメラで写した映像の明度、コンストラクトの変更、グレイスケールにした後アウトラインの強調など

また、サーフェイスの描画先をMeshRendererとして描画することも可能のようです Projection surface を User Defined に変更してスクリプト上で操作

また、それらはサンプルプロジェクトとしてSDK内に含まれているのでこれを確認するのが非常におすすめです https://developer.oculus.com/documentation/unity/unity-sf-passthrough/

パススルーが表示されない

実装している中でパススルーが表示されない現象にハマったのでメモ

UnderLay + Camera の Environment → Background Type をSkyboxにしている

3ACA92893435FDD8D7D6361CA635DF7D

正距円筒図法の動画を再生しない場合、実行時にSkyboxコンポーネントのEnableが外れるようにしているため問題ないと思っていたのですがここがSkyboxになっていると黒で塗りつぶされてしまいます